<?php
error_reporting(E_ALL ^E_DEPRECATED ^E_STRICT);
//マシン環境定義クラスモジュール
require_once dirname(__FILE__) . '/environment.php';
define('APPLICATION_NAME', 'JSC');
// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
define('APP_PATH', realpath(dirname(__FILE__) . '/../application'));
// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));
// Ensure library/ is on include_path
// require_once dirname(__FILE__) . '/include_path_env.php';
 set_include_path(
 	env::ゼンドフレームワークインクルードパス . PATH_SEPARATOR . get_include_path()
);
set_include_path(
	env::マイリブインクルードパス . PATH_SEPARATOR . get_include_path()
);
set_include_path(
	env::スマーティインクルードパス . PATH_SEPARATOR . get_include_path()
);
require_once 'Zend/Loader.php';
require_once 'Zend/Loader/Autoloader.php';
$autoLoader = Zend_Loader_Autoloader::getInstance();
require_once 'simpletest/unit_tester.php';
require_once 'simpletest/reporter.php';
/**
 * アクションコントローラ単体テストインターフェイス
 */
class SimpleActionControllerTester extends UnitTestCase
{
	/** アクションコントローラ */
	public $controller;
	/** ゼンドリクエスト */
	protected $_objRequest;
	/** ゼンドレスポンス */
	protected $_objResponse;
	/**
	 * イニシャライズ(non-PHPdoc)
	 * @see SimpleTestCase::setUp()
	 */
	public function setUp() {
		require_once 'Zend/Controller/Request/Http.php';
		$this->_objRequest = new Zend_Controller_Request_Http ();
		require_once 'Zend/Controller/Response/Http.php';
		$this->_objResponse = new Zend_Controller_Response_Http ();
	}
	/**
	 * publicではないメソッドを実行
	 * @param string $methodName
	 * @param mixed $p1,,, 引数（可変5個まで）
	 */
	protected function _invokeReflectionedMethod($methodName, $p1=NULL, $p2=NULL, $p3=NULL, $p4=NULL, $p5=NULL)
	{
		$methodA = new ReflectionMethod($this->controller, $methodName);
		$methodA->setAccessible(true);
		if ($p5 !== NULL) {
			$result = $methodA->invoke($this->controller, $p1,$p2,$p3,$p4,$p5);
		} else if ($p4 !== NULL) {
			$result = $methodA->invoke($this->controller, $p1,$p2,$p3,$p4);
		} else if ($p3 !== NULL) {
			$result = $methodA->invoke($this->controller, $p1,$p2,$p3);
		} else if ($p2 !== NULL) {
			$result = $methodA->invoke($this->controller, $p1,$p2);
		} else if ($p1 !== NULL) {
			$result = $methodA->invoke($this->controller, $p1);
		} else {
			$result = $methodA->invoke($this->controller);
		}
		return $result;
	}
	/**
	 * 外部クラスのメソッドを替え玉にすり替える
	 * @param $className 外部クラス名
	 * @param $methodName 外部クラスのすり替え対象メソッド名
	 * @param $destClassName 替え玉クラス名
	 * @param $destMethodName 替え玉メソッド名
	 */
	protected function _switchClassMethod($className, $methodName, $destClassName, $destMethodName)
	{
		/* まずは対象の外部クラスをしっかり調査 */
		$classReference = new ReflectionClass ($className);
		/* すり替え対象の外部クラスにすり替えるメソッドが定義済みでない場合はすり替えではなく追加にする*/
		if ($classReference->hasMethod($methodName)) {
			runkit_method_remove($className,$methodName);
		}
		runkit_method_copy($className, $methodName, $destClassName, $destMethodName);
	}
}
class ユニットテストケース extends UnitTestCase
{
	/** アクションコントローラ */
	public $テストクラスインスタンス;
	/** ゼンドリクエスト */
	protected $ゼンドリクエスト;
	/** ゼンドレスポンス */
	protected $ゼンドレスポンス;
	/**
	 * イニシャライズ(non-PHPdoc)
	 * @see SimpleTestCase::setUp()
	 */
	public function setUp() {
		require_once 'Zend/Controller/Request/Http.php';
		$this->ゼンドリクエスト = new Zend_Controller_Request_Http ();
		require_once 'Zend/Controller/Response/Http.php';
		$this->ゼンドレスポンス = new Zend_Controller_Response_Http ();
	}
	/**
	 * publicではないメソッドを実行
	 * @param string $methodName
	 * @param mixed $p1,,, 引数（可変5個まで）
	 */
	protected function 強行($強行メソッド名, $p1=NULL, $p2=NULL, $p3=NULL, $p4=NULL, $p5=NULL)
	{
		$methodA = new ReflectionMethod($this->テストクラスインスタンス, $強行メソッド名);
		$methodA->setAccessible(true);
		if ($p5 !== NULL) {
			$result = $methodA->invoke($this->テストクラスインスタンス, $p1,$p2,$p3,$p4,$p5);
		} else if ($p4 !== NULL) {
			$result = $methodA->invoke($this->テストクラスインスタンス, $p1,$p2,$p3,$p4);
		} else if ($p3 !== NULL) {
			$result = $methodA->invoke($this->テストクラスインスタンス, $p1,$p2,$p3);
		} else if ($p2 !== NULL) {
			$result = $methodA->invoke($this->テストクラスインスタンス, $p1,$p2);
		} else if ($p1 !== NULL) {
			$result = $methodA->invoke($this->テストクラスインスタンス, $p1);
		} else {
			$result = $methodA->invoke($this->テストクラスインスタンス);
		}
		return $result;
	}
	/**
	 * クラスメソッドをモッククラスメソッドに差し替える
	 * @param  $オリジナルクラスメソッド名  クラス名::メソッド名
	 * @param  $モッククラスメソッド名  クラス名::メソッド名
	 * @return boolean
	 */
	protected function クラスメソッドモック化($オリジナルクラスメソッド名, $モッククラスメソッド名)
	{
		$返却値 = TRUE;
		$オリジナルクラスメソッド名分割 = explode('::', $オリジナルクラスメソッド名);
		/* フォーマット判定 */
		if (count($オリジナルクラスメソッド名分割) != 2) {
			return FALSE;
		}
		$モッククラスメソッド名分割 = explode('::', $モッククラスメソッド名);
		/* フォーマット判定 */
		if (count($モッククラスメソッド名分割) != 2) {
			return FALSE;
		}
		$返却値 = $this->_switchClassMethod(
				$オリジナルクラスメソッド名分割[0],
				$オリジナルクラスメソッド名分割[1],
				$モッククラスメソッド名分割[0],
				$モッククラスメソッド名分割[1]);
		return $返却値;
	}
	/**
	 * 外部クラスのメソッドを替え玉にすり替える
	 * @param $className 外部クラス名
	 * @param $methodName 外部クラスのすり替え対象メソッド名
	 * @param $destClassName 替え玉クラス名
	 * @param $destMethodName 替え玉メソッド名
	 */
	protected function _switchClassMethod($className, $methodName, $destClassName, $destMethodName)
	{
		/* まずは対象の外部クラスをしっかり調査 */
		$classReference = new ReflectionClass ($className);
		/* すり替え対象の外部クラスにすり替えるメソッドが定義済みでない場合はすり替えではなく追加にする*/
		if ($classReference->hasMethod($methodName)) {
			runkit_method_remove($className,$methodName);
		}
		runkit_method_copy($className, $methodName, $destClassName, $destMethodName);
	}
}
/**
 * プライベートプロパティアクセスメソッドコピー元
 * runkit_method_copyで被験クラスにテストプロセスでコピーする
 */
class ActionControllerTestController
{
	/**
	 * プライベートプロパティアクセスメソッド
	 * @param string $name
	 */
	public function getValue($name)
	{
		return $this->$name;
	}
}
//uopz_overload(ZEND_EXIT, function(){});
define('PRELOAD_DIR', __DIR__);
